Skip to content

ci: dependabot config, scanning, and a fix for hanging Linux jobs - #425

Merged
TimelordUK merged 3 commits into
masterfrom
chore/dependabot-overrides-and-scanning
Aug 19, 2026
Merged

ci: dependabot config, scanning, and a fix for hanging Linux jobs#425
TimelordUK merged 3 commits into
masterfrom
chore/dependabot-overrides-and-scanning

Conversation

@TimelordUK

Copy link
Copy Markdown
Owner

Rolls up the CI/supply-chain work on this branch, plus a fix for the Linux job hangs seen on the dependabot PRs.

The hang

Linux test jobs intermittently stalled in Install Linux dependencies and ran until the 6 hour job limit. Two runs were stuck at once on different Node versions (26 on #414, 24 on #422), which rules out anything version specific.

The hosted runner mirrorlist points apt at azure.archive.ubuntu.com. When that is unreachable apt falls back to archive.ubuntu.com, which can trickle bytes indefinitely. Nothing failed the step: it had no timeout-minutes, and apt had no acquire timeout. Even healthy runs spent 5-12 minutes here, and the successful legs still fell back to archive.ubuntu.com for the actual .debs.

Changes

  • timeout-minutes: 20 on the three Linux setup steps, so a stall fails fast instead of burning a runner for hours
  • apt runs under timeout with explicit Acquire::*::Timeout and Acquire::Retries, and apt-get update retries up to three times. The outer timeout is the part that matters -- apt's own timeouts only fire on a stalled socket, not on a slow trickle
  • gcc-10/g++-10 dropped from test.yml. They pull ~48 MB out of noble universe via the same flaky mirror, and binding.gyp only pins that toolchain when it finds it on PATH, so the default gcc covers the -std=c++20 it asks for. prebuild.yml keeps the pin, where the older toolchain matters for ABI compatibility of published binaries

Also on this branch: dependabot config, npm audit workflow, CodeQL, and pinned overrides for 12 dev-only advisories.

Validation

This PR's own Linux jobs exercise the fixed workflow, since pull_request runs use the workflow file from the head branch.

🤖 Generated with Claude Code

TimelordUK and others added 3 commits August 19, 2026 20:39
Linux jobs intermittently stalled in "Install Linux dependencies" and ran
until the job timeout. The hosted runner mirrorlist points apt at
azure.archive.ubuntu.com, which is regularly unreachable; apt falls back
to archive.ubuntu.com and can trickle bytes indefinitely. Nothing failed
the step: it had no timeout-minutes and apt had no acquire timeout.

Two runs were stuck this way at once, on different Node versions (26 and
24), which rules out anything version specific.

- add timeout-minutes: 20 to the three Linux setup steps
- run apt under `timeout` with explicit Acquire timeouts and retries, and
  retry `apt-get update` up to three times
- drop gcc-10/g++-10 from the test workflow: ~48 MB out of noble universe
  via the same flaky mirror, and binding.gyp only pins that toolchain when
  it finds it on PATH, so the default gcc covers the -std=c++20 it asks
  for. prebuild.yml keeps the pin for ABI compatibility of published
  binaries.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
"Create test databases" failed intermittently with:

  Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Login failed
  for user 'sa'.

potatoqualitee/mssqlsuite reports success after a fixed 10s sleep plus a
`docker ps` check. On a slow first boot that lands while the container is
still running its upgrade steps - the log for the failing job shows it was
literally still at "Starting up database 'model_msdb'" when the action
declared the server accessible, and sqlcmd was rejected 0.6s later.

Replace the fixed sleep with a poll for a login that actually succeeds, up
to two minutes, dumping container logs if it never does. The Windows job
had the same fixed-sleep guess, so it gets the same treatment.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The apt hardening stopped Linux jobs hanging, but a leg that draws a bad
runner still crawls: one Node 24 job spent 16m25s in this step while its
siblings finished the same step in 88 seconds. It got there by burning
`timeout 300` retries against a mirror that was not serving.

The remaining dependency on that mirror is small. Once gcc-10 was dropped,
the only packages still coming from the ubuntu archive are unixodbc-dev and
about five deps - roughly 350 KB, all from main. Everything else comes from
packages.microsoft.com, which is fast in every run we have logs for. So the
step was dragging 11 MB of package indexes across a broken mirror in order
to install 350 KB.

Refresh only the Microsoft repo and let the ubuntu packages resolve from the
lists the runner image already ships (a healthy run shows these as "Hit:"
lines). Only if that install fails do we pay for a full apt-get update, with
the existing retry loop behind it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@TimelordUK
TimelordUK merged commit aa3c7b5 into master Aug 19, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant